package com.cn.delan.core.util;

import java.io.*;
import java.util.jar.*;
import java.util.zip.ZipEntry;
/**
 * 文件工具类
 * @author BingGo
 *
 */
public class FileUtil {
	/**
	 * 统计文件大小，当文件为文件夹时统计文件夹大小
	 * @param file 进行统计的文件对象
	 * @return 文件大小，单位为字节
	 */
	public static long size(File file){
		long length = 0;
		if(file.isFile()){
			length = file.length();
		}else{
			for(File subFile:file.listFiles()){
				length += size(subFile);
			}
		}
		return length;
	}
	/**
	 * 将文件压缩，并返回文件压缩数量。
	 * @param file 要进行压缩的文件
	 * @param zipFile 压缩后的文件
	 * @return 进行压缩的文件数量，不包含文件夹
	 * @throws IOException 压缩过程读写文件出错抛出此异常
	 */
	public static int zip(File file,File zipFile) throws IOException{
		int length = 0;
		if(!file.exists()){
			return length;
		}
		FileOutputStream fos = new FileOutputStream(zipFile);
		JarOutputStream jos = new JarOutputStream(fos);
		int plen = file.getAbsolutePath().length() - file.getName().length();
		if(file.isFile()){
			jos.putNextEntry(new ZipEntry(file.getName()));
			FileInputStream fis = new FileInputStream(file);
			byte []b = new byte[2000];
			int len = -1;
			while((len=fis.read(b))!=-1){
				jos.write(b, 0, len);
			}
			jos.closeEntry();
			length++;
		}else{
			jos.putNextEntry(new ZipEntry(file.getName()+"/"));
			jos.closeEntry();
			for(File subFile:file.listFiles()){
				length += zip(jos,subFile,plen);
			}
		}
		jos.finish();
		jos.close();
		return length;
	}
	/**
	 * 为压缩文件提供支持，即子文件压缩
	 * @param jos 压缩的输出流
	 * @param file 要压缩的文件
	 * @param plen 压缩文件的顶层目录的路径长度
	 * @return 返回子文件压缩数量
	 * @throws IOException 压缩过程读写文件出错抛出此异常
	 */
	private static int zip(JarOutputStream jos,File file,int plen) throws IOException{
		int length = 0;
		if(file.isFile()){
			jos.putNextEntry(new ZipEntry(file.getAbsolutePath().substring(plen)));
			FileInputStream fis = new FileInputStream(file);
			byte []b = new byte[2000];
			int len = -1;
			while((len=fis.read(b))!=-1){
				jos.write(b, 0, len);
			}
			jos.closeEntry();
			length++;
		}else{
			jos.putNextEntry(new ZipEntry(file.getAbsolutePath().substring(plen)+"/"));
			jos.closeEntry();
			for(File subFile:file.listFiles()){
				length += zip(jos,subFile,plen);
			}
		}
		return length;
	}
	/**
	 * 将文件解压，并返回解压文件数量
	 * @param file 要进行解压的文件
	 * @param unZipDir 解压后的存放位置
	 * @return 解压文件的数量
	 * @throws IOException 解压过程读写文件出错抛出此异常
	 */
	public static int unzip(File file,File unZipDir) throws IOException{
		int length = 0;
		if(!file.exists()){
			return length;
		}
		FileInputStream fis = new FileInputStream(file);
		JarInputStream jis = new JarInputStream(fis);
		ZipEntry entry = null;
		while((entry=jis.getNextEntry())!=null){
			byte[] b = new byte[2000];
			int len = -1;
			File unzip = new File(unZipDir,entry.getName());
			if(entry.isDirectory()){
				unzip.mkdirs();
				continue;
			}
			FileOutputStream fos = new FileOutputStream(unzip);
			while((len=jis.read(b))!=-1){
				fos.write(b, 0, len);
			}
			fos.close();
			length++;
		}
		return length;
	}
	/**
	 * 删除文件，当删除文件为文件夹时删除整个文件夹，并返回删除数量，包含删除的文件夹
	 * @param file 进行删除操作的文件
	 * @return 删除文件数量
	 */
	public static int del(File file){
		int count = 0;
		if(!file.exists()){
			return count;
		}
		if(file.isFile()){
			file.delete();
			count++;
		}else{
			for(File subFile:file.listFiles()){
				count += del(subFile);
			}
			file.delete();
			count++;
		}
		return count;
	}
	/**
	 * 复制文件
	 * @param sfile 进行复制的文件
	 * @param dfile 复制产生的新文件
	 * @throws IOException 复制过程读写文件出错抛出此异常
	 */
	public static void copy(File sfile,File dfile) throws IOException{
		if(sfile.exists()){
			if(sfile.isFile()){
				if(!dfile.exists()){
					dfile.getParentFile().mkdirs();
				}
				FileInputStream fis = new FileInputStream(sfile);
				FileOutputStream fos = new FileOutputStream(dfile);
				byte b[] = new byte[10240];
				int len = -1;
				while((len=fis.read(b))!=-1){
					fos.write(b, 0, len);
				}
				fos.close();
				fis.close();
			}else{
				for(File file:sfile.listFiles()){
					copy(file,new File(dfile,file.getName()));
				}
			}
		}
	}
	public static void main(String [] args) throws IOException{
		File file = new File("src");
		File zipFile = new File("src.zip");
		File unzipFile = new File("srcunzip");
//		System.out.println(zip(file,zipFile));
//		System.out.println(unzip(zipFile,unzipFile));
	}
}
